#include <iostream>
#include <string>
#include <ctime>
#include <cstring>
#include <pthread.h>
#include <unistd.h>
using namespace std;

void* run(void* args)
{
    char *name = (char *)args;
    while(true)
    {
        cout << name << endl;
        sleep(1);
    }
    return nullptr;
}
int main()
{
    pthread_t tids[10];
    for (int i = 0; i < 10; ++i)
    {
        char tname[64];
        snprintf(tname, sizeof(tname), "Thread_%d", i + 1);
        pthread_create(tids + i, nullptr, run, tname);
    }
    while(true)
    {
        sleep(1);
    }
    return 0;
}

// std::string hexAddr(pthread_t tid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%x", tid);
//     return buffer;
// }

// void *thread_run(void *)
// {
//     while (true)
//     {
//         cout << hexAddr(pthread_self()) << endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, thread_run, (void *)"thread_1");
//     pthread_join(tid, nullptr);
//     return 0;
// }

// void* thread_run(void*)
// {
//     sleep(5);
//     return (void*)1;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, thread_run, (void *)"thread_1");
//     sleep(1);
//     pthread_cancel(tid);
//     void *retval = nullptr;
//     pthread_join(tid, &retval);
//     cout << "Return val: " << (int)retval << endl;
//     PTHREAD_CANCELED;
//     return 0;
// }

// #define NUM 10
// enum
// {
//     OK = 0,
//     ERROR
// };

// class ThreadData
// {
// public:
//     ThreadData(const string &name, int id, time_t time, int addTo)
//         : _name(name),
//           _id(id),
//           _createTime(time),
//           _addTo(addTo),
//           _result(0)
//     {
//         _status = OK;
//     }

// public:
//     // 输入参数
//     string _name;
//     int _id;
//     uint64_t _createTime;
//     // 输出参数
//     int _status;
//     int _addTo;
//     int _result;
// };

// void *thread_run(void *attr)
// {
//     // ThreadData *td = (ThreadData *)attr;
//     ThreadData *td = static_cast<ThreadData *>(attr);
//     // 计算
//     for (int i = 1; i <= td->_addTo; ++i)
//     {
//         td->_result += i;
//     }
//     sleep(td->_id);
//     cout << "线程" << td->_name << "计算结束，已退出" << endl;
//     pthread_exit(td); // return td;
// }

// int main()
// {
//     pthread_t tids[NUM];
//     int gap = 0;
//     // 创建NUM个线程
//     for (int i = 0; i < NUM; ++i)
//     {
//         char thread_name[64];
//         snprintf(thread_name, 64, "thread_%d", i + 1);
//         ThreadData *td = new ThreadData(thread_name, i + 1, time(nullptr), 100 + gap);
//         gap += 5;
//         pthread_create(tids + i, nullptr, thread_run, td);
//     }
//     // 主线程
//     void *retval = nullptr;
//     for (int i = 0; i < NUM; ++i)
//     {
//         int n = pthread_join(tids[i], &retval); // 等待成功才往后运行，否则阻塞在这里
//         if (n != 0)
//             cerr << "pthread_join failed." << endl;
//         ThreadData *td = static_cast<ThreadData *>(retval);

//         if(td->_status == OK)
//             cout << "计算任务[1," << td->_addTo << "]成功, 计算结果为: " << td->_result << endl;
//         delete td;
//     }

//     return 0;
// }